package lsl.practice.chapter1.test02;

/**
 * 二进制加法
 *
 * @author Zed
 * @description
 * @date 2022/12/15 21:53
 */
public class Client {
    public static void main(String[] args) {
        System.out.println(addBinary("1101", "10"));
    }

    public static String addBinary(String a, String b) {
        //1.进行十进制加法的时候，总是将两个数字的右端对齐，然后从它们的个位开始从右向左相加同一位置上的两个数位
        //2.如果前一位有进位还要加上进位
        //3.二进制加法也可以采用类似的方法，从字符串的右端出发向左做加法
        //4.二进制是逢二进一，当两个数位加起来等于2时就会产生进位
        StringBuilder result = new StringBuilder();
        int n = Math.max(a.length() - 1, b.length() - 1);
        int carry = 0;
        for (int i = 0; i <= n; i++) {
            int e = a.length() - 1 - i >= 0 ? a.charAt(a.length() - 1 - i) - '0' : 0;
            int f = b.length() - 1 - i >= 0 ? b.charAt(b.length() - 1 - i) - '0' : 0;
            int sum = e + f + carry;
            carry = sum >= 2 ? 1 : 0;
            sum = sum >= 2 ? sum - 2 : sum;
            result.append(sum);
        }
        if (carry > 0) {
            result.append(carry);
        }
        //5.该方法的加法是从字符串的右端开始的
        //最低位保存在result的最左边，而通常数字最左边保存的是最高位，因此在返回结果之前要将result翻转
        return result.reverse().toString();
    }
}
